﻿Imports System
Imports Microsoft.Win32
Imports System.Collections.Generic

Public Class Aplicativo
    Implements IComparable(Of Aplicativo)
    Private _nome As String
    Private _versao As String

    Public Function CompareTo(ByVal other As Leitura_Registro_Cliente.Aplicativo) As Integer Implements IComparable(Of Aplicativo).CompareTo
        If Nome.CompareTo(other.Nome) = 0 Then
            Return Versao.CompareTo(other.Versao)
        Else
            Return Nome.CompareTo(other.Nome)
        End If
    End Function


    Public Sub New(ByVal nome As String, ByVal versao As String)
        Me.Nome = nome
        Me.Versao = versao

    End Sub

    Public Property Nome() As String
        Get
            Return _nome
        End Get
        Set(ByVal Valor As String)
            _nome = Valor
        End Set
    End Property

    Public Property Versao() As String
        Get
            Return _versao
        End Get
        Set(ByVal Valor As String)
            _versao = Valor
        End Set
    End Property

    Public Shadows Function ToString() As String
        Return Nome + " - " + Versao
    End Function

    Public Shared Function MontarLista() As List(Of Aplicativo)
        Dim Aplicativos As New List(Of Aplicativo)
        Dim appName, appVersion As String

        'Chave do registro do Windows referente à máquina local
        Dim regKey As RegistryKey = Registry.LocalMachine

        'Chave onde são encontradas todas as informações dos programas instalados no computador
        regKey = regKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")

        'Obtém a relação de subchaves em um vetor do tipo string
        'Cada elemento do vetor retornado aponta para o nome de uma chave de um programa instalado
        Dim keys() As String = regKey.GetSubKeyNames()

        'Verifica se o vetor retornado é válido
        If (Not (keys Is Nothing)) And keys.Length > 0 Then

            'Percorre todo o vetor de chaves para obter o nome de exibição (DisplayName) de cada programa instalado
            For i = 0 To keys.Length - 1 Step 1
                'Abre a subchave atual do vetor
                Dim k As RegistryKey = regKey.OpenSubKey(keys(i))

                'Este bloco try-catch evita que o programa aborte caso a subchave não possua uma valor DisplayName
                Try
                    'Obtém o valor DisplayName (nome de exibição do programa) da subchave atual
                    appName = k.GetValue("DisplayName").ToString()

                Catch ex As Exception
                    'Em caso de exceção não faz nada, apenas continua a varrer o vetor de subchaves
                    appName = ""
                End Try


                'Este bloco try-catch evita que o programa aborte caso a subchave não possua uma valor DisplayVersion
                Try
                    'Obtém o valor DisplayVersion (nome de exibição do programa) da subchave atual
                    appVersion = k.GetValue("DisplayVersion").ToString()

                Catch ex As Exception
                    'Em caso de exceção insere "vazio" no item
                    appVersion = ""
                End Try

                If (((Not (appVersion Is Nothing)) And (appVersion.Length > 0)) Or ((Not (appName Is Nothing)) And (appName.Length > 0))) Then
                    Aplicativos.Add(New Aplicativo(appName, appVersion))
                End If
            Next

        End If

        'Ordena os valores
        Aplicativos.Sort()
        Return Aplicativos

    End Function


End Class
